package ink.liaoxuefeng.threaddemo.demo01;

/**
 * @author wangzhuangzhuang
 * @Description:
 * @date 2022-06-02 13:08
 */

/**
 * 中断线程的两种方式：
 * 1. t.interrupt();
 * 2. 设置标志位
 */
public class TestDemo08 {

	public static void main(String[] args) throws InterruptedException {
		Thread t = new StopThreadByInterrupt();
		t.start();
		Thread.sleep(1000); // 中断t线程
		t.interrupt(); // 等待t线程结束
		System.out.println("end");
	}

}

class StopThreadByInterrupt extends Thread {
	@Override
	public void run() {
		Thread hello = new HelloThread();
		hello.start(); // 启动hello线程
		try {
			hello.join(); // 等待hello线程结束
		} catch (InterruptedException ex){
			System.out.println("interrupted !");
		}
		hello.interrupt();
	}
}

class HelloThread extends Thread {
	@Override
	public void run() {
		int n = 0;
		while(!isInterrupted()){
			n ++;
			System.out.println(n + " hello !");
			try {
				Thread.sleep(100);
			}catch(InterruptedException ex){
				break;
			}
		}
	}
}
/**
 * main线程通过调用t.interrupt()从而通知t线程中断
 * 此时t线程正位于hello.join()的等待中，此方法会立刻等待并抛出InterrupteException
 * t线程结束之前，对hello线程也进行interrupt()调用通知其中断。
 * 若去掉hello中的interrupt()调用会发现hello线程仍然会继续运行，而且JVM不会退出。
 * */